//package com.gosling.cloudspace.tools;
//
//import cn.hutool.core.date.DateUtil;
//import com.alibaba.excel.EasyExcel;
//import com.alibaba.excel.write.metadata.WriteSheet;
//import com.baomidou.mybatisplus.core.metadata.IPage;
//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
//import PageRequestDto;
//import WhereSqlEntity;
//import OrderInfoPO;
//import org.apache.poi.xssf.streaming.SXSSFRow;
//import org.apache.poi.xssf.streaming.SXSSFSheet;
//import org.apache.poi.xssf.streaming.SXSSFWorkbook;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
//
//import javax.servlet.ServletOutputStream;
//import javax.servlet.http.HttpServletResponse;
//import java.io.*;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.concurrent.CountDownLatch;
//
///**
// * alibaba.excel 大文件多线程导出
// * @author lihonglin
// * @date 2023/2/20 16:16
// */
//public class PoiExcelBigDataTool {
//    public static com.alibaba.excel.ExcelWriter excelWriter = null;
//    protected final Logger logger = LoggerFactory.getLogger(getClass());
//    CountDownLatch countDownLatch = new CountDownLatch(5);
//    ThreadPoolTaskExecutor threadPool = new ThreadPoolTaskExecutor();
//
//    public static void main(String[] args) {
//        long start = System.currentTimeMillis();
//        outputExcel("D:\\项目说明\\9、批量操作\\test.xlsx");
//        long end = System.currentTimeMillis();
//        System.out.println((end - start) / 1000 + "：秒");
//    }
//
//    /**
//     * 文件转字节数组
//     *
//     * @param fobj
//     * @return
//     */
//    public static byte[] file2buf(File fobj) {
//        byte[] buffer = null;
//        try {
//            if (!fobj.exists()) {
//                return null;
//            }
//            FileInputStream fis = new FileInputStream(fobj);
//            ByteArrayOutputStream bos = new ByteArrayOutputStream();
//            byte[] b = new byte[1024];
//            int len = -1;
//            while ((len = fis.read(b)) != -1) {
//                bos.write(b, 0, len);
//            }
//            fis.close();
//            bos.close();
//            buffer = bos.toByteArray();
//        } catch (FileNotFoundException e) {
//            e.printStackTrace();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        return buffer;
//    }
//
//    public static void outputExcel(String filePath) {
//        System.out.println();
//        //创建文件输出流
//        File file = new File(filePath);
//        SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook();
//        OutputStream outputStream = null;
//        try {
//            outputStream = new FileOutputStream(file);
//            // 获取每个标点的相关信息
//            List<WhereSqlEntity> list = new ArrayList<>();
//            for (int i = 0; i < 1000000; i++) {
//                WhereSqlEntity e = new WhereSqlEntity();
//                e.setTableName("周边标点数据01");
//                e.setTarget("周边标点数据01");
//                e.setResource("周边标点数据01");
//                list.add(e);
//            }
//            SXSSFSheet sheet1 = sxssfWorkbook.createSheet("周边标点数据01");
//            List<SXSSFSheet> sheetList = new ArrayList<>();
//            sheetList.add(sheet1);
//            //循环创建多个sheet页
//            for (SXSSFSheet sheet : sheetList) {
//                setSheet(list, sheet);
//            }
//            //数据写入工作目
//            sxssfWorkbook.write(outputStream);
//        } catch (Exception e) {
//            e.printStackTrace();
//        } finally {
//            //释放资源
//            IOTool.closeQuietly(sxssfWorkbook);
//            IOTool.closeQuietly(outputStream);
//        }
//    }
//
//    /***
//     * 多个循环的执行体
//     *
//     * @param list
//     * @param sheet1
//     */
//    private static void setSheet(List<WhereSqlEntity> list, SXSSFSheet sheet1) {
//        // 创建工作表的首行
//        SXSSFRow headerRow = sheet1.createRow(0);
//        // 给工作表的首行的列进行赋值
//        sheet1.setRandomAccessWindowSize(1000);
//        headerRow.createCell(0).setCellValue("序号");
//        headerRow.createCell(1).setCellValue("小区名称");
//        headerRow.createCell(2).setCellValue("小区类型");
//        headerRow.createCell(3).setCellValue("小区经纬度");
//        headerRow.createCell(4).setCellValue("小区所属行政区");
//        headerRow.createCell(5).setCellValue("小区所属行政区");
//        headerRow.createCell(6).setCellValue("小区所属行政区");
//        headerRow.createCell(7).setCellValue("小区所属行政区");
//        headerRow.createCell(8).setCellValue("小区所属行政区");
//        headerRow.createCell(9).setCellValue("小区所属行政区");
//        headerRow.createCell(10).setCellValue("小区所属行政区");
//        headerRow.createCell(11).setCellValue("小区所属行政区");
//        headerRow.createCell(12).setCellValue("小区所属行政区");
//        headerRow.createCell(13).setCellValue("小区所属行政区");
//        headerRow.createCell(14).setCellValue("小区所属行政区");
//        headerRow.createCell(15).setCellValue("小区所属行政区");
//        headerRow.createCell(16).setCellValue("小区所属行政区");
//        headerRow.createCell(17).setCellValue("小区所属行政区");
//        headerRow.createCell(18).setCellValue("小区所属行政区");
//        headerRow.createCell(19).setCellValue("小区所属行政区");
//        headerRow.createCell(20).setCellValue("小区所属行政区");
//        headerRow.createCell(21).setCellValue("小区所属行政区");
//        headerRow.createCell(22).setCellValue("小区所属行政区");
//        headerRow.createCell(23).setCellValue("小区所属行政区");
//        headerRow.createCell(24).setCellValue("小区所属行政区");
//        headerRow.createCell(25).setCellValue("小区所属行政区");
//        headerRow.createCell(26).setCellValue("小区所属行政区");
//        headerRow.createCell(27).setCellValue("小区所属行政区");
//        headerRow.createCell(28).setCellValue("小区所属行政区");
//        headerRow.createCell(29).setCellValue("小区所属行政区");
//        headerRow.createCell(30).setCellValue("小区所属行政区");
//        // 用于创建行数【不包含表头行】
//        int number = 0;
//        // 用于设置序号【不包含表头行】
//        int num1 = 0;
//        for (WhereSqlEntity residentialAroundDataDTO : list) {
//            System.out.println("第" + number + "条");
//            if (number == 1000000) {
//                break;
//            }
//            SXSSFRow row1 = sheet1.createRow(++number);
//            row1.createCell(0).setCellValue(++num1);
//            row1.createCell(1).setCellValue(residentialAroundDataDTO.getTableName());
//            row1.createCell(2).setCellValue(residentialAroundDataDTO.getTarget());
//            row1.createCell(3).setCellValue(residentialAroundDataDTO.getTarget());
//            row1.createCell(4).setCellValue(residentialAroundDataDTO.getTableName());
//            row1.createCell(5).setCellValue(residentialAroundDataDTO.getTableName());
//            row1.createCell(6).setCellValue(residentialAroundDataDTO.getTableName());
//            row1.createCell(7).setCellValue(residentialAroundDataDTO.getTableName());
//            row1.createCell(8).setCellValue(residentialAroundDataDTO.getTableName());
//            row1.createCell(9).setCellValue(residentialAroundDataDTO.getTableName());
//            row1.createCell(10).setCellValue(residentialAroundDataDTO.getTableName());
//            row1.createCell(11).setCellValue(residentialAroundDataDTO.getTableName());
//            row1.createCell(12).setCellValue(residentialAroundDataDTO.getTableName());
//            row1.createCell(13).setCellValue(residentialAroundDataDTO.getTableName());
//            row1.createCell(14).setCellValue(residentialAroundDataDTO.getTableName());
//            row1.createCell(15).setCellValue(residentialAroundDataDTO.getTableName());
//            row1.createCell(16).setCellValue(residentialAroundDataDTO.getTableName());
//            row1.createCell(17).setCellValue(residentialAroundDataDTO.getTableName());
//            row1.createCell(18).setCellValue(residentialAroundDataDTO.getTableName());
//            row1.createCell(19).setCellValue(residentialAroundDataDTO.getTableName());
//            row1.createCell(20).setCellValue(residentialAroundDataDTO.getTableName());
//            row1.createCell(21).setCellValue(residentialAroundDataDTO.getTableName());
//            row1.createCell(22).setCellValue(residentialAroundDataDTO.getTableName());
//            row1.createCell(23).setCellValue(residentialAroundDataDTO.getTableName());
//            row1.createCell(24).setCellValue(residentialAroundDataDTO.getTableName());
//            row1.createCell(25).setCellValue(residentialAroundDataDTO.getTableName());
//            row1.createCell(26).setCellValue(residentialAroundDataDTO.getTableName());
//            row1.createCell(27).setCellValue(residentialAroundDataDTO.getTableName());
//            row1.createCell(28).setCellValue(residentialAroundDataDTO.getTableName());
//            row1.createCell(29).setCellValue(residentialAroundDataDTO.getTableName());
//            row1.createCell(30).setCellValue(residentialAroundDataDTO.getTableName());
//        }
//    }
//
//    /***
//     * alibaba.excel 大文件多线程导出
//     * @param params
//     * @param response
//     * @throws InterruptedException
//     */
//    public void easyExportBigData(PageRequestDto params, HttpServletResponse response) throws InterruptedException {
//        long startTime = System.currentTimeMillis();
//        params.setSize(100000);
////        Integer total = this.selectMaxPage(params);
//        Integer total = 1000000;
//        int maxPage = total / params.getPage() + 1;
//        final String filePath = "/home/newton/" + "test" + ".xlsx";
//        File file = new File(filePath);
//        countDownLatch = new CountDownLatch(maxPage);
//        excelWriter = null;
//        excelWriter = EasyExcel.write(filePath, OrderInfoPO.class).build();
//        for (int i = 1; i <= maxPage; i++) {
//            //设置页
//            final int currpage = i;
//            WriteSheet writeSheet = EasyExcel.writerSheet(currpage, "工作表" + currpage).build();
//            //查询内容
//            params.setCurrPage(currpage);
//            IPage<OrderInfoPO> page = new Page<>();
////            IPage<OrderInfoPO> page = this.queryPageForExport(params);
//            threadPool.execute(() -> {
//                //对文件进行上锁，防止出现数据安全问题
//                synchronized (file) {
//                    excelWriter.write(page.getRecords(), writeSheet);
//                    countDownLatch.countDown();
//                    logger.info("sheet{}页已写入,总页数{}", currpage, maxPage);
//                }
//            });
//        }
//        countDownLatch.await();
//        excelWriter.finish();
//        writeToResponse(response, startTime, excelWriter, file);
//    }
//
//    public void writeToResponse(HttpServletResponse response, long startTime, com.alibaba.excel.ExcelWriter writer, File file) {
//        try (ServletOutputStream out = response.getOutputStream()) {
//            //response为HttpServletResponse对象
//            response.setContentType("application/vnd.ms-excel;charset=utf-8");
//            //test.xls是弹出下载对话框的文件名，不能为中文，中文请自行编码
//            response.setHeader("Content-Disposition", "attachment;filename=" + "diffinfo" + DateUtil.now() + ".xlsx");
//            //out为OutputStream，需要写出到的目标流
////            EasyExcel.write(out);
//            out.write(file2buf(file));
//            out.flush();
//            logger.info("导出完成,耗时:{}ms", System.currentTimeMillis() - startTime);
//        } catch (IOException e) {
//            e.printStackTrace();
//        } finally {
//            // 关闭writer，释放内存
//        }
//    }
//}
